package com.guang.lock.condition;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.TimeUnit;

/**
 * @Description 使用ReentrantLock中的条件队列来演示
 * 但是Tom线程一直不工作。所以得让老板修改加班制度，但是老板不同意，并且告知Tom，爱干不干
 * @Author liguang
 * @Date 2022/10/20/19:13
 */
public class SyncronizedConditionProRThreeTest {

    private final static Logger logger = LoggerFactory.getLogger(SyncronizedConditionProRThreeTest.class);


    static Object lock = new Object();

    // 加班是否有假可调休
    static boolean haveVocation = false;

    public static void main(String[] args) {

        // tom是高级开发。无所不能，无所不会
        Thread tom = new Thread(() -> {
            workUp();
        }, "tom");
        tom.start();

        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                workUp();
            }, "normal").start();
        }

        try {
            TimeUnit.SECONDS.sleep(5);
            logger.info("因为项目未上线，老板得知normal程序员无法解决这里的问题。还是得找Tom大佬解决，决定修改只读，让Tom大佬起来解决");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        new Thread(() -> {
            synchronized (lock) {
                // 不修改制度
                haveVocation = false;
                logger.info("BOSS将加班制度改掉了，Tom大佬快起来干活吧");
                lock.notify();
            }
        }, "boss").start();


    }

    public static void workUp() {
        synchronized (lock) {
            if (Thread.currentThread().getName().equals("tom")) {
                if (!haveVocation) {
                    logger.info("当前加班没有调休，那么tom就不干，什么时候有假期，我什么时候干活");
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                logger.info("Tom大佬开始写代码");
            } else {
                logger.info("Tom在休息的时候不干，我们普通程序员来干");
            }
        }
    }
}


